package cn.shiva.redisunit.message.list;

import cn.shiva.redisunit.message.MessageBO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * @author shiva   2022-08-15 9:55
 */
@Slf4j
public class MessageListConsumer implements Runnable {

    private RedisTemplate redisTemplate;

    public MessageListConsumer(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 右侧消息出队；
     * 1.最长阻塞时间为5分钟，到达时间或者获取到消息，就会立刻结束监听
     * 2.所以在redis关闭连接、或者消息返回后，要重新开启监听
     */
    @Override
    public void run() {
        while (true) {
            try {
                //方法返回后，监听就结束了，所以加了个死循环，反正这边也是单线程阻塞监听
                MessageBO messageBO = (MessageBO) redisTemplate.opsForList().rightPop("message:list-mq", 5, TimeUnit.MINUTES);
                handle(messageBO);
            } catch (Exception e) {
                log.info("监听出错，一般是超时，断开连接了");
            }
        }
    }

    // 获得消息后的处理操作
    public void handle(MessageBO messageBO) {
        if (messageBO == null) {
            log.info("阻塞监听队列消息超时了");
            return;
        }
        log.info("获得队列消息：{}", messageBO);
        //TODO 这边可以加入处理出错，然后怎么重新入队，或者加个死信队列
    }

}
